package day4;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

//反射测试方法
public
class TestMethod {
    public static
    void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //1.获取类对象
        Class c=Class.forName("day4.Per");
        //2.获取方法
        //getDeclaredMethods() 获取所有方法 包括私有方法
        //getMethods() 获取所有公开方法 包括父类的公开方法
        //getDeclaredMethod(方法名，参数类型.class) 获取单个方法 包括私有方法
        //getMethod(方法名，参数类型.class) 获取单个公开方法 包括父类的公开方法
        Method[] ms=c.getDeclaredMethods();
        for (Method m:ms){
            String name=m.getName();
            Class[] cs=m.getParameterTypes();
            Class returnType=m.getReturnType();
            System.out.println("方法名："+name+" 参数类型："+Arrays.toString(cs)+" 返回类型："+returnType);
        }
        System.out.println("-------------------------------");
        //获取单个方法 然后执行 c.getDeclaredMethod(方法名，可变长的方法参数类型.class)
        //如果方法的参数类型不确定 可以使用Object.class
        //个数不确定 可以使用Object[].class String ... a 表示可变长度参数（本质是数组）
        // test1(1,2,3,4,5,6,7,8,9,10);
        Method m1=c.getDeclaredMethod("test1");
        Method m2=c.getDeclaredMethod("test2", String.class, Integer.class);
        Method m3=c.getDeclaredMethod("test3", int.class, int.class);
        m2.setAccessible(true);//设置方法的访问权限 可以访问私有方法
        //3.执行方法
        //invoke(对象，可变长的参数) 用于执行方法
        //如果方法没有返回值 可以使用null
        //如果方法有返回值 可以使用Object接收
        Per p=new Per(10);
        Object o=m1.invoke(p);
        Object o1=m2.invoke(p,"周正",18);
        Object o2=m3.invoke(p,10,20);
        System.out.println(o+" "+o1+" "+o2);

    }
    public static void test(Object... a){
        for (Object o:a){
            System.out.println(o);
        }
    }
}
